// new 操作符
// 作用：用于实例化一个对象

// new 做了什么：
//    1.在内存中创建一个新对象
//    2.这个新对象内部的[[prototype]]特性被赋值为构造函数的prototype属性
//    3.构造函数内部的this被赋值为这个新对象(即this指向新对象)
//    4.执行构造函数内部的代码(给新对象添加属性)
//    5.如果构造函数返回非空 对象，则返回该对象；否则，返回刚创建的新对象。


// func是构造函数，...args是需要传给构造函数的参数
function myNew(func, ...args) {
  if(typeof func != 'function') { throw new Error(func + ' is not a constructor') }
  // 创建一个空对象
  let obj = Object.create(func)
  // 将 obj 绑定到构造函数上,并传入剩余函数
  let res = func.apply(obj, ...args)
  // 判断构造函数返回值类型
  return res instanceof Object ? res : obj
}